package com.evil.application.service.impl;

import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.evil.application.api.RemoteApplicationQueueService;
import com.evil.application.mapper.ApplicationQueueMapper;
import com.evil.application.pojo.dto.queue.*;
import com.evil.application.pojo.entity.ApplicationQueue;
import com.evil.application.service.ApplicationQueueService;
import com.evil.common.account.util.LoginUtil;
import com.evil.common.application.enums.queue.QueueStatusEnum;
import com.evil.common.core.util.StreamUtil;
import com.evil.file.api.RemoteFileService;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;
import java.util.Objects;

/**
 * 应用队列表
 *
 * @author liyang
 * @date 2022-08-08 00:00
 */
@Slf4j
@RestController
@AllArgsConstructor
public class ApplicationQueueServiceImpl extends ServiceImpl<ApplicationQueueMapper, ApplicationQueue>
        implements ApplicationQueueService, RemoteApplicationQueueService {

    private final LoginUtil loginUtil;

    private final ApplicationLogServiceImpl applicationLogService;

    private final RemoteFileService remoteFileService;

    /**
     * 我的队列
     *
     * @param myQueueReqDTO myQueueReqDTO
     * @return List
     */
    @Override
    public List<QueueRespDTO> myQueue(MyQueueReqDTO myQueueReqDTO) {
        List<ApplicationQueue> queues = this.baseMapper.findByUserEnterprise(loginUtil.getLoginUserEnterprise());
        return StreamUtil.transListT(queues, this::toDTO);
    }

    /**
     * 添加应用队列
     *
     * @param addQueueReqDTO addQueueReqDTO
     * @return QueueRespDTO
     */
    @Override
    public QueueRespDTO addQueue(AddQueueReqDTO addQueueReqDTO) {
        addQueueReqDTO.check();
        // 检查企业
        loginUtil.checkEnterpriseId(addQueueReqDTO.getEnterpriseId());

        ApplicationQueue applicationQueue = addQueueReqDTO.createApplicationQueue();
        applicationLogService.saveAndCheck(this.baseMapper, ApplicationQueue::getQueueId, applicationQueue);

        return this.toDTO(applicationQueue);
    }

    /**
     * 更新应用队列结果
     *
     * @param queueId         queueId
     * @param queueStatusEnum queueStatusEnum
     * @param queueContent    queueContent
     */
    @Override
    public void updateQueueResult(Long queueId, QueueStatusEnum queueStatusEnum, String queueContent) {
        UpdateQueueResultReqDTO updateQueueResultReqDTO = new UpdateQueueResultReqDTO();
        updateQueueResultReqDTO.setQueueId(queueId);
        updateQueueResultReqDTO.setQueueStatus(queueStatusEnum.getId());
        updateQueueResultReqDTO.setQueueContent(queueContent);
        this.updateQueueResult(updateQueueResultReqDTO);
    }

    /**
     * 更新应用队列结果
     *
     * @param updateQueueResultReqDTO updateQueueResultReqDTO
     */
    @Override
    public void updateQueueResult(UpdateQueueResultReqDTO updateQueueResultReqDTO) {
        QueueStatusEnum.isExistById(updateQueueResultReqDTO.getQueueStatus());

        ApplicationQueue applicationQueue = this.baseMapper.isExistById(updateQueueResultReqDTO.getQueueId());
        applicationQueue.setQueueStatus(updateQueueResultReqDTO.getQueueStatus());
        applicationQueue.setQueueContent(updateQueueResultReqDTO.getQueueContent());
        applicationQueue.setRemark(updateQueueResultReqDTO.getRemark());
        applicationLogService.saveAndCheck(this.baseMapper, ApplicationQueue::getQueueId, applicationQueue);
    }

    private QueueRespDTO toDTO(ApplicationQueue queue) {
        QueueRespDTO queueRespDTO = BeanUtil.copyProperties(queue, QueueRespDTO.class, ApplicationQueue.COL_QUEUE_CONTENT);
        if (Objects.nonNull(queue.getQueueFileId())) {
            remoteFileService.isExistBaseByFileId(queue.getQueueFileId()).ifPresent(queueRespDTO::setQueueFile);
        }
        if (StringUtils.isNotBlank(queue.getQueueContent())) {
            QueueContentDTO queueContentDTO = BeanUtil.copyProperties(queue.getQueueContent(), QueueContentDTO.class);
            queueRespDTO.setQueueContent(queueContentDTO);
        }
        return queueRespDTO;
    }
}
